# -*- coding: utf-8 -*-
"""
基础模型模块
目的：提供统一的基础模型类，处理时区等共性问题
"""
from datetime import datetime
from sqlalchemy import Column, Integer, TIMESTAMP, func
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.types import TypeDecorator

Base = declarative_base()

class BeijingTimestamp(TypeDecorator):
    """
    自定义时间戳类型，确保正确处理北京时间
    目的：解决MySQL TIMESTAMP时区转换问题
    """
    impl = TIMESTAMP
    cache_ok = True

    def process_bind_param(self, value, dialect):
        """存储到数据库时的处理"""
        if value is None:
            return None
        # 确保使用当前时间（北京时间）
        if isinstance(value, datetime) and value.tzinfo is None:
            # 无时区信息，假设是北京时间，直接存储
            return value
        return value

    def process_result_value(self, value, dialect):
        """从数据库读取时的处理"""
        if value is None:
            return None
        # TIMESTAMP会自动转换为会话时区，我们确保会话时区是+08:00
        return value

class BaseModel(Base):
    """
    基础模型类
    目的：提供通用的字段和方法
    """
    __abstract__ = True

    # 主键
    id = Column(Integer, primary_key=True, autoincrement=True, comment='主键')

    # 通用时间字段
    created_at = Column(
        BeijingTimestamp,
        nullable=False,
        default=func.current_timestamp(),
        comment='创建时间'
    )
    updated_at = Column(
        BeijingTimestamp,
        nullable=False,
        default=func.current_timestamp(),
        onupdate=func.current_timestamp(),
        comment='更新时间'
    )